treeview: Don't invalidate whole tree unless needed
authorAlexander Larsson <alexl@redhat.com>
Thu, 6 Dec 2012 21:28:11 +0000 (22:28 +0100)
committerAlexander Larsson <alexl@redhat.com>
Thu, 6 Dec 2012 21:28:11 +0000 (22:28 +0100)
We currently invalidate the whole tree every time the style state
changes in the tree view. The primary reason for this is to catch
default font changes as that may affect text cell renderers. But
cell renderers could *potentially* also read other style properties
(although that seems weird and unlikely).

We handle this by invalidating only when some state that affects sizes
is changed. This includes all the font properties.

gtk/gtktreeview.c

index d651bd62b2c31a38c16016e490f67f3f99f0c2b5..c422172d813628611aae65f86203d4b971abaae8 100644 (file)
@@ -8461,6 +8461,8 @@ gtk_tree_view_style_updated (GtkWidget *widget)
   GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
   GList *list;
   GtkTreeViewColumn *column;
+  GtkStyleContext *style_context;
+  const GtkBitmask *changes;
 
   GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->style_updated (widget);
 
@@ -8472,16 +8474,19 @@ gtk_tree_view_style_updated (GtkWidget *widget)
       gtk_tree_view_set_enable_tree_lines (tree_view, tree_view->priv->tree_lines_enabled);
     }
 
-  for (list = tree_view->priv->columns; list; list = list->next)
+  style_context = gtk_widget_get_style_context (widget);
+  changes = _gtk_style_context_get_changes (style_context);
+  if (changes == NULL || _gtk_css_style_property_changes_affect_size (changes))
     {
-      column = list->data;
-      _gtk_tree_view_column_cell_set_dirty (column, TRUE);
-    }
-
-  tree_view->priv->fixed_height = -1;
-  _gtk_rbtree_mark_invalid (tree_view->priv->tree);
+      for (list = tree_view->priv->columns; list; list = list->next)
+       {
+         column = list->data;
+         _gtk_tree_view_column_cell_set_dirty (column, TRUE);
+       }
 
-  gtk_widget_queue_resize (widget);
+      tree_view->priv->fixed_height = -1;
+      _gtk_rbtree_mark_invalid (tree_view->priv->tree);
+    }
 }